package com.example.commonUpAndDownFileutil.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class FileCommonUtil {
    public enum FileType {
        // 未知
        UNKNOWN,
        // 压缩文件
        ZIP, GZ
    }

    /**
     * 获取文件真实类型
     *
     * @param file 要获取类型的文件。
     * @return 文件类型枚举。
     */
    public static FileType getFileType(File file){
        if (file== null || !file.exists()) {
            return FileType.UNKNOWN;
        }
        // 使用 try-with-resources 自动关闭 FileInputStream
        try (FileInputStream inputStream = new FileInputStream(file)) {
            byte[] head = new byte[4];
            // 读取文件头4个字节（若文件小于4字节，read返回实际读取长度，不影响后续判断）
            int readLength = inputStream.read(head);
            if (readLength == -1) { // 文件为空
                return FileType.UNKNOWN;
            }

            // 将文件头字节转换为整数（用于判断文件类型）
            int headHex = 0;
            for (byte b : head) {
                headHex <<= 8;
                headHex |= (b & 0xFF); // 处理负数字节，确保无符号转换
            }

            // 根据文件头标识判断类型
            switch (headHex) {
                case 0x504B0304: // ZIP 文件头标识
                    return FileType.ZIP;
                case 0x1F8B0800: // GZ 文件头标识（替换原负数表示，更直观）
                    return FileType.GZ;
                default:
                    return FileType.UNKNOWN;
            }
        } catch (IOException e) { // 明确捕获 IO 异常（更精确）
            System.out.printf(e.getMessage());
//            e.printStackTrace(); // 实际应用中建议替换为日志记录
        }
        // 若发生异常，默认返回未知类型
        return FileType.UNKNOWN;
    }
}
